#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""  
@Project : Pythonxiangmu
@File : test.py
@Author : 楼下小栋
@Time : 2025/11/3 10:55  
@脚本说明 : 
"""
import subprocess
import crypt  # 用于计算密码哈希（Python内置，兼容Linux加密算法）

def check_weak_password():
    """检查是否存在空口令或使用123456作为密码的账户"""
    try:
        # 1. 检查空口令账户（密码字段为空）
        empty_pass_result = subprocess.check_output(
            "cat /etc/shadow | awk -F: '$2 == \"\" {print $1}'",
            shell=True,
            universal_newlines=True  # 兼容低版本Python，替代text=True
        )
        empty_pass_users = [user for user in empty_pass_result.strip().split('\n') if user]

        # 2. 检查使用123456作为密码的账户
        weak_pass = "123456"
        weak_pass_users = []

        # 提取所有有效用户的密码哈希（排除禁用账户：密码字段为*或!）
        hash_result = subprocess.check_output(
            "cat /etc/shadow | awk -F: '$2 !~ /^[*!]/ && $2 != \"\" {print $1 \":\" $2}'",
            shell=True,
            universal_newlines=True
        )

        for line in hash_result.strip().split('\n'):
            if not line:
                continue
            user, hash_val = line.split(':', 1)  # 分割用户名和哈希值

            # 解析哈希值中的算法和盐值（Linux哈希格式：$id$salt$hash）
            # 例如：$6$abc123$xyz... 中，id=6（SHA-512），salt=abc123
            parts = hash_val.split('$')
            if len(parts) < 4:
                continue  # 无效哈希格式，跳过
            algo_id = parts[1]  # 算法标识（1=MD5，6=SHA-512等）
            salt = parts[2]     # 盐值

            # 用相同算法和盐值计算123456的哈希
            # crypt.crypt会自动根据盐值格式选择算法（如$6$开头则用SHA-512）
            generated_hash = crypt.crypt(weak_pass, f"${algo_id}${salt}$")

            # 比对生成的哈希与系统存储的哈希是否一致
            if generated_hash == hash_val:
                weak_pass_users.append(user)

        # 整合检测结果
        details = []
        if empty_pass_users:
            details.append(f"空口令账户：{', '.join(empty_pass_users)}")
        if weak_pass_users:
            details.append(f"使用弱密码'123456'的账户：{', '.join(weak_pass_users)}")

        if details:
            return {
                'name': '是否存在弱口令',
                'compliant': False,
                'risk_level': '高危',
                'detail': '; '.join(details),
                'remediation': '1. 立即修改空口令和弱密码账户；2. 配置PAM密码复杂度策略（如最小长度、包含大小写/数字/特殊字符）；3. 启用账户锁定机制'
            }
        else:
            return {
                'name': '是否存在弱口令',
                'compliant': True,
                'risk_level': '无',
                'detail': '未发现空口令或使用123456的账户',
                'remediation': '保持现有密码策略，定期审计'
            }

    except Exception as e:
        return {
            'name': '是否存在弱口令',
            'compliant': False,
            'risk_level': '未知',
            'detail': f'检查失败：{str(e)}',
            'remediation': '1. 确保以root权限运行（需读取/etc/shadow）；2. 检查Python版本是否支持crypt模块'
        }

if __name__ == '__main__':
    print(check_weak_password())